#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/socket.h>
#include <sys/sem.h>
#include <assert.h>
#include <stdio.h>

union semun {
    int val;
    struct semid_ds *buf;
    unsigned short int* array;
    struct seminfo *_buf;
};

void P(int sem_id) {
    struct sembuf sem;
    sem.sem_flg = SEM_UNDO;
    sem.sem_op = -1;
    // 表示第一个信号量
    sem.sem_num = 0;
    semop(sem_id, &sem, 1);
}

void V(int sem_id) {
    struct sembuf sem;
    sem.sem_flg = SEM_UNDO;
    sem.sem_op = 1;
    // 表示第一个信号量
    sem.sem_num = 0;
    semop(sem_id, &sem, 1);
}

int main() {
    // 创建一个信号量
    int sem1 = semget(IPC_PRIVATE, 1, 0666);
    int sem2 = semget(IPC_PRIVATE, 1, 0666);

    // 设置初值
    union semun sem_un;
    sem_un.val = 1;
    semctl(sem1, 0, SETVAL, sem_un);
    
    sem_un.val = 0;
    semctl(sem2, 0, SETVAL, sem_un);

    pid_t pid = fork();
    if (pid == 0) {
        P(sem1);
        printf("hello\n");
        V(sem2);
    } else {
        P(sem2);
        printf("world\n");
    }
    int status;
    wait(&status);
    semctl(sem1, 0, IPC_RMID, sem_un);
    semctl(sem2, 0, IPC_RMID, sem_un); 
    return 0;
}